#!/usr/bin/env node
/**
 * 创建基础数据表（users, admins）
 * 基于数据库设计文档和模型代码结构
 */

const { pool, query: dbQuery } = require('../src/config/database');
const bcrypt = require('bcryptjs');

// 创建 users 表 DDL（基于 User 模型和数据库设计文档）
const CREATE_USERS_TABLE = `
CREATE TABLE IF NOT EXISTS users (
  user_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
  username VARCHAR(50) DEFAULT NULL COMMENT '用户名',
  email VARCHAR(100) UNIQUE DEFAULT NULL COMMENT '邮箱地址',
  phone VARCHAR(20) DEFAULT NULL COMMENT '手机号码',
  password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希值',
  first_name VARCHAR(50) DEFAULT NULL COMMENT '名字',
  last_name VARCHAR(50) DEFAULT NULL COMMENT '姓氏',
  date_of_birth DATE DEFAULT NULL COMMENT '出生日期',
  gender ENUM('male', 'female', 'other') DEFAULT NULL COMMENT '性别',
  profile_image_url VARCHAR(255) DEFAULT NULL COMMENT '头像URL',
  membership_level ENUM('bronze', 'silver', 'gold', 'platinum') DEFAULT 'bronze' COMMENT '会员等级',
  points_balance INT DEFAULT 0 COMMENT '积分余额',
  total_spent DECIMAL(10,2) DEFAULT 0.00 COMMENT '总消费金额',
  preferred_language VARCHAR(10) DEFAULT 'zh' COMMENT '首选语言',
  email_verified BOOLEAN DEFAULT FALSE COMMENT '邮箱是否已验证',
  phone_verified BOOLEAN DEFAULT FALSE COMMENT '手机号是否已验证',
  is_active BOOLEAN DEFAULT TRUE COMMENT '是否激活',
  last_login_at TIMESTAMP NULL DEFAULT NULL COMMENT '最后登录时间',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  INDEX idx_email (email),
  INDEX idx_phone (phone),
  INDEX idx_username (username),
  INDEX idx_is_active (is_active),
  INDEX idx_membership_level (membership_level)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
`;

// 创建 admins 表 DDL（基于 auth 中间件的查询需求）
const CREATE_ADMINS_TABLE = `
CREATE TABLE IF NOT EXISTS admins (
  admin_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '管理员ID',
  user_id INT NOT NULL COMMENT '关联用户ID',
  username VARCHAR(50) UNIQUE NOT NULL COMMENT '管理员用户名',
  email VARCHAR(100) UNIQUE NOT NULL COMMENT '管理员邮箱',
  password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希值',
  name VARCHAR(50) NOT NULL COMMENT '管理员姓名',
  role ENUM('super_admin', 'admin', 'manager', 'staff') DEFAULT 'staff' COMMENT '角色',
  permissions JSON DEFAULT NULL COMMENT '权限列表',
  is_active BOOLEAN DEFAULT TRUE COMMENT '是否激活',
  last_login_at TIMESTAMP NULL DEFAULT NULL COMMENT '最后登录时间',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
  INDEX idx_user_id (user_id),
  INDEX idx_username (username),
  INDEX idx_email (email),
  INDEX idx_role (role),
  INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员表';
`;

async function createBaseTables() {
  try {
    console.log('🔧 开始创建基础表...');
    
    // 创建 users 表
    console.log('创建 users 表...');
    await dbQuery(CREATE_USERS_TABLE);
    console.log('✅ users 表创建成功');
    
    // 创建 admins 表
    console.log('创建 admins 表...');
    await dbQuery(CREATE_ADMINS_TABLE);
    console.log('✅ admins 表创建成功');
    
    console.log('🎉 所有基础表创建完成');
  } catch (error) {
    console.error('❌ 创建基础表失败:', error.message);
    throw error;
  }
}

async function seedInitialData() {
  try {
    console.log('🌱 插入初始数据...');
    
    // 检查是否已存在管理员用户
    const existingAdmin = await dbQuery('SELECT COUNT(*) as count FROM users WHERE email = ?', ['admin@example.com']);
    if (existingAdmin[0].count > 0) {
      console.log('✅ 管理员用户已存在，跳过初始化');
      return;
    }
    
    // 创建默认管理员账户
    const adminEmail = process.env.ADMIN_EMAIL || 'admin@example.com';
    const adminPassword = process.env.ADMIN_PASSWORD || '123456';
    
    // 加密密码
    const passwordHash = await bcrypt.hash(adminPassword, 12);
    
    // 插入管理员用户
    const userResult = await dbQuery(
      `INSERT INTO users (username, email, password_hash, first_name, last_name, is_active, created_at, updated_at) 
       VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW())`,
      ['admin', adminEmail, passwordHash, 'Admin', 'User', true]
    );
    
    const userId = userResult.insertId;
    
    // 插入管理员记录
    await dbQuery(
      `INSERT INTO admins (user_id, username, email, password_hash, name, role, is_active, created_at, updated_at) 
       VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), NOW())`,
      [userId, 'admin', adminEmail, passwordHash, 'Admin User', 'super_admin', true]
    );
    
    console.log(`✅ 管理员账户创建成功: ${adminEmail}`);
    console.log(`   用户名: admin`);
    console.log(`   密码: ${adminPassword}`);
    
  } catch (error) {
    console.error('❌ 插入初始数据失败:', error.message);
    throw error;
  }
}

async function main() {
  try {
    await createBaseTables();
    await seedInitialData();
    console.log('\n🎉 基础表初始化完成！');
    console.log('现在可以运行 syncMenuData.js 同步菜单数据了。');
    process.exit(0);
  } catch (error) {
    console.error('脚本执行失败:', error);
    process.exit(1);
  }
}

if (require.main === module) {
  main();
}

module.exports = { createBaseTables, seedInitialData };